package com.mender.lovebible.config;

import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.DocumentSplitter;
import dev.langchain4j.data.document.loader.ClassPathDocumentLoader;
import dev.langchain4j.data.document.parser.apache.pdfbox.ApachePdfBoxDocumentParser;
import dev.langchain4j.data.document.splitter.DocumentSplitters;
import dev.langchain4j.memory.ChatMemory;
import dev.langchain4j.memory.chat.ChatMemoryProvider;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import dev.langchain4j.rag.content.retriever.ContentRetriever;
import dev.langchain4j.rag.content.retriever.EmbeddingStoreContentRetriever;
import dev.langchain4j.store.embedding.EmbeddingStore;
import dev.langchain4j.store.embedding.EmbeddingStoreIngestor;
import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore;
import dev.langchain4j.store.memory.chat.ChatMemoryStore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.List;

@Configuration
public class CommonConfig {

    @Autowired
    private ChatMemoryStore redisChatMemoryStore;

//    @Autowired
//    private EmbeddingModel embeddingModel;
//
//    @Autowired
//    private RedisEmbeddingStore redisEmbeddingStore;

//    构建会话记忆对象
    @Bean
    public ChatMemory chatMemory() {
        return MessageWindowChatMemory.builder()
                .maxMessages(20)//最大保存的会话记录数量
                .build();
    }

//    构建ChatMemoryProvider对象
    @Bean
    public ChatMemoryProvider chatMemoryProvider() {
        ChatMemoryProvider chatMemoryProvider = memoryId -> MessageWindowChatMemory.builder()
                .id(memoryId)//id值
                .maxMessages(20)//最大会话记录数量
                .chatMemoryStore(redisChatMemoryStore)//配置ChatMemoryStore
                .build();
        return chatMemoryProvider;
    }

    /**
     * 构建向量数据库操作对象
     *
     */
    @Bean
    public EmbeddingStore store(){
        //1.加载文档进内存-----content为所有文档所在的根路径
//        List<Document> documents = ClassPathDocumentLoader.loadDocuments("content");
        //加载文档的时候指定解析器
        List<Document> documents =
                ClassPathDocumentLoader.loadDocuments("content",new ApachePdfBoxDocumentParser());
        //2.构建向量数据库操作对象  操作的是内存版本的向量数据库
        InMemoryEmbeddingStore store = new InMemoryEmbeddingStore();

        //构建文档分割器对象
        DocumentSplitter ds = DocumentSplitters.recursive(500,100);

        //3.构建一个EmbeddingStoreIngestor对象,完成文本数据切割,向量化, 存储
        EmbeddingStoreIngestor ingestor = EmbeddingStoreIngestor.builder()
                .embeddingStore(store)
//                .embeddingStore(redisEmbeddingStore)
//                .documentSplitter(ds)
//                .embeddingModel(embeddingModel)//设置向量模型
                .build();
        ingestor.ingest(documents);
        return store;
    }

    /**
     * 构建内容检索器 -- 向量数据库检索对象
//     * @param store
     * @return
     */
    @Bean
    public ContentRetriever contentRetriever(EmbeddingStore store){
        return EmbeddingStoreContentRetriever.builder()
                .embeddingStore(store)//设置向量数据库操作对象
//                .embeddingStore(redisEmbeddingStore)
                .minScore(0.5)//设置最小分数
                .maxResults(3)//设置最大片段数量
//                .embeddingModel(embeddingModel)//设置向量模型
                .build();
    }
}
